﻿using System.Collections.Generic;
using System;

namespace ApplicationGenerator.Forms.Actions
{
    /// <summary>
    /// Fabryka akcji dla formularza.
    /// Pozwala również na mapowanie instancji akcji na jej nazwę i odwrotnie
    /// </summary>
    public class ActionStrategyChooser
    {
        #region Fields
        /// <summary>
        /// Nazwa akcji Cofnij
        /// </summary>
        private static string prevAction = "Cofnij";

        /// <summary>
        /// Nazwa akcji Zapisz
        /// </summary>
        private static string saveAction = "Zapisz";

        /// <summary>
        /// Nazwa akcji Kontynuuj proces
        /// </summary>
        private static string continueWorkflowAction = "Kontynuuj proces";

        /// <summary>
        /// Nazwa akcji Wywołaj web serwis
        /// </summary>
        private static string invokeWebService = "Wywołaj web serwis";
        #endregion

        #region Methods

        /// <summary>
        /// Tworzy instancję akcji na podstawie nazwy
        /// </summary>
        /// <param name="strategy">Nazwa akcji</param>
        /// <returns>Nowa instancja akcji</returns>
        public static ActionBase GetStrategy(string strategy)
        {
            if (prevAction == strategy)
            {
                return new PrevAction();
            }
            else if (saveAction == strategy)
            {
                return new SaveAction();
            }
            else if (continueWorkflowAction == strategy)
            {
                return new ContinueWorkflowAction();
            }
            else if (invokeWebService == strategy)
            {
                return new InvokeWebServiceAction();
            }
            else
            {
                throw new NotSupportedException("Inne typy akcji nie są wspierane");
            }
        }

        /// <summary>
        /// Pobiera listę nazw dostępnych akcji
        /// </summary>
        /// <returns>Lista nazw dostępnych akcji</returns>
        public static List<string> GetAllActions()
        {
            List<string> actions = new List<string>();
            actions.Add(prevAction);
            actions.Add(saveAction);
            actions.Add(continueWorkflowAction);
            actions.Add(invokeWebService);

            return actions;
        }

        /// <summary>
        /// Pobiera nazwę akcji na podstawie typu
        /// </summary>
        /// <param name="actionBase">Typ akcji</param>
        /// <returns>Nazwa akcji</returns>
        public static string GetActionName(ActionBase actionBase)
        {
            if (actionBase is PrevAction)
            {
                return prevAction;
            }
            else if (actionBase is SaveAction)
            {
                return saveAction;
            }
            else if (actionBase is ContinueWorkflowAction)
            {
                return continueWorkflowAction;
            }
            else if (actionBase is InvokeWebServiceAction)
            {
                return invokeWebService;
            }
            else
            {
                return null;
            }
        }

        #endregion
    }
}
